package com.itlong.cloud.property.dao;

import com.itlong.cloud.POJO.PO.DeviceEntranceInfoPO;
import com.itlong.cloud.POJO.VO.common.CloudEntranceVO;
import com.itlong.cloud.POJO.VO.property.*;
import com.itlong.cloud.abstracts.IAbstractBaseDao;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

/**
 * <desc>
 *   门禁持久层对象
 * </desc>
 *
 * @createDate 2017/9/21
 */
@Mapper
@Repository
public interface IDeviceEntranceInfoDao extends IAbstractBaseDao<DeviceEntranceInfoPO> {

    /**
     * <desc>
     *      添加门禁信息表
     * <desc/>
     * @param   params   bean转换层的map参数集
     * @return
     * @author Biao.R
     * @createDate 2017/9/21
     */
    Integer save(Map<String, Object> params);

    /**
     * <desc>
     *      更新门禁
     * <desc/>
     * @param   params  bean转换层map后的参数集
     * @return
     * @author Biao.R
     * @createDate 2017/9/26
     */
    Integer update(Map<String, Object> params);


    /**
     * <desc>
     *      根据设备唯一码查询单个电梯
     * <desc/>
     * @param   deviceUnique    设备唯一码
     * @return      PropertyEquipGetVO    设备返回对象
     * @author Biao.R
     * @createDate 2017/9/27
     */
    DeviceEntranceInfoPO getByDeviceUnique(String deviceUnique);

    /**
     * <desc>
     *      根据设备唯一码删除已有设备数据
     * <desc/>
     * @param   deviceUnique   设备唯一码
     * @return
     * @author Juguang.S
     * @createDate 2019/11/4
     */
    void deleteByDeviceUnique(String deviceUnique);

    /**
     * <desc>
     *      获取根据条件查询分页数据集
     * <desc/>
     * @param   params  查询参数
     * @return 分页数据集
     * @author Biao.R
     * @createDate 2017/10/9
     */
    List<PropertyEquipGetVO> getPage(Map<String, Object> params);

    /**
     * <desc>
     *      获取根据条件查询分页总数量
     * <desc/>
     * @param   params  查询参数
     * @return 分页总数量
     * @author Biao.R
     * @createDate 2017/10/9
     */
    Integer getCount(Map<String, Object> params);

    /**
     * <desc>
     *      获取分页数据集
     * <desc/>
     * @param   params  查询参数
     * @return 分页数据集
     * @author Juguang.Song
     * @createDate 2018/3/22
     */
    List<PropertyEquipGetVO> getEntranceInfoPageList(Map<String, Object> params);

    /**
     * <desc>
     *      获取分页总数量
     * <desc/>
     * @param   params  查询参数
     * @return 分页数据集
     * @author Juguang.Song
     * @createDate 2018/3/22
     */
    Integer getPageCount(Map<String, Object> params);

    /**
     * <desc>
     *      获取某项目中的设备唯一码列表
     * <desc/>
     *
     * @param projectId 项目编号
     * @return
     * @author Chunjian.G
     * @createDate 2017-12-15
     */
    List<String> getDeviceUniquesByProjectId(@Param("projectId") String projectId);

    /**
     * <desc>
     *      批量添加门禁设备信息
     * <desc/>
     *
     * @param entranceInfoPOS
     * @return
     * @author Chunjian.G
     * @createDate 2017-12-15
     */
    Integer saveBatch(List<DeviceEntranceInfoPO> entranceInfoPOS);

    /**
     * <desc>
     *     获取人脸识别门禁分页数据集
     * </desc>
     *
     * @param params 查询参数
     * @return 分页数据集
     * @author wangzhi
     * @createDate 2018/05/11
     */
    List<PropertyPadFaceEquipVO> getFaceEntrance(Map<String, Object> params);

    /**
     * <desc>
     *     获取人脸识别门禁分页数据集总数
     * </desc>
     *
     * @param params 查询参数
     * @return 总数据数量
     * @author wangzhi
     * @createDate 2018/05/11
     */
    Integer getFaceEntranceCount(Map<String, Object> params);

    /**
     * <desc>
     *     获取一体式人脸识别门禁分页数据集
     * </desc>
     *
     * @param params 查询参数
     * @return 分页数据集
     * @author Qiang.S
     * @createDate 2020/06/01
     */
    List<PropertyPadFaceEquipVO> getUnibodyFaceEntrance(Map<String, Object> params);

    /**
     * <desc>
     *     获取一体式人脸识别门禁分页数据集总数
     * </desc>
     *
     * @param params 查询参数
     * @return 总数据数量
     * @author Qiang.S
     * @createDate 2020/06/01
     */
    Integer getUnibodyFaceEntranceCount(Map<String, Object> params);

    /**
     * <desc>
     *      根据deviceUnique查询设备所支持功能
     * <desc/>
     * @param   deviceUnique    设备唯一码
     * @return      设备支持功能
     * @author Juguang.S
     * @createDate 2019/2/20
     */
    String getDeviceFunctionInfo(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *     获取之前添加所有门禁设备信息
     * </desc>
     *
     * @author Juguang.S
     * @createDate 2019/02/21
     */
    List<DeviceEntranceInfoPO> getEntranceInfo();

    /**
     * <desc>
     *     批量修改门禁信息
     * </desc>
     *
     * @param batchParams 待修改的信息
     * @return
     * @author Juguang.S
     * @createDate 2019/02/21
     */
    Integer batchUpdateDeviceEntranceInfo(List<Map<String,Object>> batchParams);

    /**
     * <desc>
     *      设备上报，修改相关门禁的信息
     * <desc/>
     *
     * @param params
     * @return
     * @author Juguang.S
     * @createDate 2019-02-22
     */
    Integer updateEntranceInfo(Map<String,Object> params);


    /**
     * <desc>
     *      获取云门禁房间开门密码集合
     * </desc>
     *
     * @param params
     * @return
     * @author Juguang.S
     * @createDate 2019-02-22
     */
    List<CloudEntranceRoomPwdVO> getPullDevicePwdPage(Map<String,Object> params);

    /**
     * <desc>
     *      获取云门禁房间开门密码集合总数量
     * </desc>
     *
     * @param params
     * @return
     * @author Juguang.S
     * @createDate 2019-02-22
     */
    Integer getPullDevicePwdPageCount(Map<String,Object> params);

    /**
     * <desc>
     *      根据项目编号和房间ID查询该项目下的用户是否被冻结
     * </desc>
     *
     * @return
     * @author Juguang.S
     * @createDate 2019-02-22
     */
    Integer getUserIsFrost(@Param("projectId") String projectId,@Param("roomId") String roomId);

    /**
     * <desc>
     *      根据sn查询以该sn作为控制器的设备
     * </desc>
     *
     * @return
     * @author Juguang.S
     * @createDate 2019-03-05
     */
    List<String> getSnbyBingDeviceGroup(@Param("sn") String sn);

    /**
     * <desc>
     *     修改处理控制器控制门数减少时的bindDeviceGroup信息
     * </desc>
     *
     * @param sn
     * @return
     * @author Juguang.S
     * @createDate 2019-03-05
     */
    Integer updateBindDeviceGroup(@Param("sn") String sn);

    /**
     * <desc>
     *     根据sn查询同为一个控制器的设备唯一码
     * </desc>
     *
     * @param sn
     * @return
     * @author Juguang.S
     * @createDate 2019-03-14
     */
    List<String> getSameControllerDevice(@Param("sn") String sn);

    /**
     * <desc>
     *      获取门禁设备iot信息
     * <desc/>
     *
     * @param deviceUnique 设备编号
     * @return
     * @author Qiang.S
     * @createDate 2019-03-15
     */
    CloudEntranceVO getDoorIotInfo(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      删除门禁角色组关联信息
     * </desc>
     *
     * @param deviceUnique 设备编号
     * @return 受影响行数
     * @author wangzhi
     * @createDate 2019/04/02
     */
    Integer deleteDeviceEntranceRole(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      拿到当前项目所有普通门禁设备序列号字符串
     * </desc>
     *
     * @return 所有普通门禁设备序列号字符串
     * @author wangzhi
     * @createDate 2019/04/24
     */
    String getAllDeviceUniqueStr(@Param("projectId") String projectId);

    /**
     * <desc>
     *      拿到该设备序列号被绑定的所有roleId
     * </desc>
     *
     * @return 该设备序列号被绑定的所有roleId
     * @author wangzhi
     * @createDate 2019/04/24
     */
    List<String> getRoleIdsByDeviceUnique(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      获取角色绑定的用户id列表
     * </desc>
     *
     * @param roleId 角色id
     * @return 用户id列表
     * @author wangzhi
     * @createDate 2019/04/24
     */
    List<String> getUserIdListByRoleId(@Param("roleId") String roleId);

    /**
     * <desc>
     *      获取角色绑定的设备序列号列表
     * </desc>
     *
     * @param roleId 角色id
     * @return 用户id列表
     * @author wangzhi
     * @createDate 2019/04/24
     */
    List<String> getDeviceUniqueListByRoleId(@Param("roleId") String roleId);

    /**
     * <desc>
     *      设备登录，修改门禁控制器和门数的关系
     * <desc/>
     *
     * @param params
     * @return
     * @author Juguang.S
     * @createDate 2019-02-22
     */
    Integer updateEntranceInfoForDoorCount(Map<String,Object> params);

    /**
     * <desc>
     *      根据房间ID查询对应的楼栋与单元ID
     * </desc>
     *
     * @param roomId 房间ID
     * @return 楼栋与单元ID
     * @author wangzhi
     * @createDate 2019/02/27
     */
    String deviceChangeLogGetBuildAndUnitIdByRoomId(@Param("roomId") String roomId);

    /**
     * <desc>
     *      获取门禁地址信息
     * </desc>
     *
     * @param entrances
     * @return
     * @author Jiaqi.X
     * @createDate 2019/10/14
     */
    List<CloudEntranceVO> getEntranceAddressInfo(@Param("entrances")String[] entrances);


    /**
     * <desc>
     * @Description:
     * </desc>
     *
     * @author: chengshican
     *  @Date: 2020-12-14 18:46
     *
     */
    CloudEntranceVO getEntranceAddressInfoById(@Param("deviceUnique") String deviceUnique);
    /**
     * <desc>
     *      获取用户黑名单信息
     * </desc>
     *
     * @param buildIds
     * @param unitIds
     * @return
     * @author Jiaqi.X
     * @createDate 2019/10/14
     */
    List<UserBlackInfoVO> getUserBlackInfos(@Param("buildIds") String[] buildIds,@Param("unitIds")String[] unitIds,@Param("projectId") String projectId);

    /**
     * <desc>
     *      获取用户临时黑名单信息
     * </desc>
     *
     * @param projectId
     * @param deviceId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/10/14
     */
    List<UserBlackInfoVO> getTempBlackInfos(@Param("projectId") String projectId,@Param("deviceId") Integer deviceId);

    /**
     * <desc>
     *      通过房间id获取用户黑名单信息
     * </desc>
     *
     * @param roomId
     * @param projectId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/10/14
     */
    List<UserBlackInfoVO> getUserBlackInfosByRoomId(@Param("roomId") String roomId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      通过房间id获取用户临时黑名单信息
     * </desc>
     *
     * @param projectId
     * @param deviceId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/10/14
     */
    List<UserBlackInfoVO> getTempBlackInfosByRoomId(@Param("roomId") String roomId,@Param("projectId") String projectId,@Param("deviceId") Integer deviceId);

    /**
     * <desc>
     *      获取门禁信息
     * </desc>
     *
     * @author Jiaqi.X　　
     * @createDate 2019/09/11
     */
    List<CloudEntranceVO> getEntranceInfos(@Param("entrances") String[] entrances);

    /**
     * <desc>
     *      查询有该机号的用户权限信息
     * </desc>
     *
     * @param deviceId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/11
     */
    List<Map<String,Object>> getTempAuths(@Param("deviceId") Integer deviceId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      查询有该机号的用户权限信息 全部权限便于考虑云联动器
     * </desc>
     *
     * @param deviceId
     * @return
     * @author Jugaung.S
     * @createDate 2021/05/20
     */
    List<Map<String,Object>> getTempAuthsByAllAuth(@Param("deviceId") Integer deviceId,@Param("projectId") String projectId);

    /**
     * <desc>
     *      查询有该机号的用户权限信息
     * </desc>
     *
     * @param projectId
     * @param userId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/11
     */
    List<Map<String,Object>> getPushTempAuths(@Param("projectId") String projectId,@Param("userId") String userId);


    /**
     * <desc>
     *      获取用户权限总量
     * </desc>
     *
     * @param deviceId
     * @param projectId
     * @param currentPage
     * @param pageSize
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/11
     */
    Integer getTempAuthsCount(@Param("deviceId") Integer deviceId,@Param("projectId") String projectId,
                                          @Param("currentPage") Integer currentPage,@Param("pageSize") Integer pageSize);

    /**
     * <desc>
     *      查询是否是联动器
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/14
     */
    String getEntranceType(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      根据设备序列号获取访客数据
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/17
     */
    List<DeviceTempVisitorVO> getVisitors(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      根据设备序列号获取访客数据
     * </desc>
     *
     * @param visitorId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/17
     */
    DeviceTempVisitorVO getVisitorsByVisitorId(@Param("visitorId") String visitorId);

    /**
     * <desc>
     *      获取门禁的组
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/25
     */
    String getEntranceGroup(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *      获取用户非临时门禁权限
     * </desc>
     *
     * @param projectId
     * @param userId
     * @return
     * @author Jiaqi.X
     * @createDate 2019/09/27
     */
    List<Map<String,Object>> getPushTempAddressAuth(@Param("projectId") String projectId,@Param("userId") String userId);

    /**
     * <desc>
     *      检测门禁设备是否存在
     * </desc>
     *
     * @param deviceUnique
     * @return
     * @author Jiaqi.X
     * @createDate 2019/11/11
     */
    Integer checkSmartCardEntranceIsOnline(@Param("deviceUnique") String deviceUnique);

    /**
     * <desc>
     *    获取产品类型代码
     * </desc>
     *
     * @param  deviceType        设备类型
     * @param  deviceAttributes  产品型号值
     * @return  String           产品类型代码
     * @Author pengwei
     * @createDate  2020/11/18
     */
    String   getProductCode(@Param("deviceType") String   deviceType,@Param("deviceAttributes") String   deviceAttributes);

    /**
     * <desc>
     *      判断当前门禁设备是否存在或是否被禁用。
     * <desc/>
     *
     * @param sn 设备序列串
     * @return
     * @author pengwei
     * @createDate 2020-11-19
     */
    String getEntranceDeviceExist(@Param("sn") String sn);


    /**
     * <desc>
     *      设备上报，修改相关特殊门禁的信息
     * <desc/>
     *
     * @param params
     * @return
     * @author pengwei
     * @createDate 2020-11-19
     */
    Integer updateSpecialEntranceInfo(Map<String,Object> params);

    /**
     * <desc>
     * 根据sn 获取状态
     * </desc>
     *
     * @param sn@return
     * @author caoshuai
     * @createDate 2020/12/27 11:44
     */
    String getStatusBySn(@Param("sn") String sn);
}
